/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package RRHH_controlador;

import CONTABILIDAD_MODELO.CON_CENTRO_COSTO;
import CONTABILIDAD_MODELO.CON_COMPROBANTE;
import CONTABILIDAD_MODELO.CON_CUENTA_COMPROBANTE;
import CONTABILIDAD_MODELO.CON_CUENTA_CONTABLE;
import CONTABILIDAD_MODELO.CON_PARAMETRIZACION_CELULARES;
import Conexion.Conexion;
import Modelo.SIS_ESPECIAL;
import RRHH_Modelo.RHH_COMPANIA_TELEFONOS;
import RRHH_Modelo.RHH_PERSONA;
import RRHH_Modelo.RHH_PLANILLA_CELULAR;
import RRHH_Modelo.RHH_PLAN_CELULAR_COMPROBANTE;
import RRHH_Modelo.RHH_TELEFONOS;
import RRHH_Modelo.RHH_USUARIO;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.util.List;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import org.apache.poi.util.IOUtils;

/**
 *
 * @author equipo_4
 */
@MultipartConfig
@WebServlet(name = "RRHH_PLANILLA_CELULARES_CONTROLLER", urlPatterns = {"/RRHH_PLANILLA_CELULARES_CONTROLLER"})
public class RRHH_PLANILLA_CELULARES_CONTROLLER extends HttpServlet {

    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            /* TODO output your page here. You may use following sample code. */
            out.println("<!DOCTYPE html>");
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet RRHH_PLANILLA_CELULARES_CONTROLLER</title>");            
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Servlet RRHH_PLANILLA_CELULARES_CONTROLLER at " + request.getContextPath() + "</h1>");
            out.println("</body>");
            out.println("</html>");
        } finally {            
            out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            String evento = request.getParameter("evento");
            String html="";
            RHH_USUARIO usuario = ((RHH_USUARIO)request.getSession().getAttribute("usr"));
            Conexion con = new Conexion(usuario.getPASSWORD(), usuario.getPASSWORD());            

            switch(evento)
            {
                case "cargar":
                    html=cargar(request,con);
                    break;
                case "guardar":
                    html=guardar(request,con);
                    break;
                case "llenartabla":
                    html=llenartabla(request,con);
                    break;
                case "pagar":
                    html=pagar(request,con);
                    break;
            }
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/plain");
            response.getWriter().write(html);
        } catch (SQLException ex) {
            Logger.getLogger(RRHH_PLANILLA_CELULARES_CONTROLLER.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(RRHH_PLANILLA_CELULARES_CONTROLLER.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    private String cargar(HttpServletRequest request,Conexion con) throws IOException, ServletException {
        try{
            Part part = request.getPart("importado");
            InputStream in = part.getInputStream();
            
            List<Integer> todos = new RHH_TELEFONOS(con).TodosNumeros();
            
            BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));        
            String linea; 
            String tabla1="";
            String tabla2="";
            while((linea=br.readLine())!=null)
            {
                StringTokenizer token = new StringTokenizer(linea,";");
                if(token.countTokens()==2)
                {
                    String numero = token.nextToken();
                    Double monto_consumido = Double.parseDouble(token.nextToken());
                    RHH_PERSONA persona = new RHH_PERSONA(con).Buscarxtelefono(numero);
                    RHH_TELEFONOS telf = new RHH_TELEFONOS(con).buscarxNumero(numero);

                    if(telf!=null)
                    {                                                
                        int index = todos.indexOf(Integer.parseInt(numero));
                        todos.remove(index);
                        if(telf.getESTADO()==0)
                        {
                            if(persona!=null)
                            {                                        
                                double monto_asignado=telf.getMONTO_CREDITO();
                                double descuento = monto_consumido-monto_asignado;
                                double iva = SIS_ESPECIAL.getCreditoFiscal(con);
                                double descuento_neto = descuento*(1-iva);
                                tabla1+="<tr><td>"+persona.getPRIMER_NOMBRE()+" "+persona.getPRIMER_APELLIDO()+"</td><td>"+persona.getCI()+"</td><td>"+telf.getNUMERO_CORTO()+"</td><td>"+numero+"</td><td>"+telf.getID_COMPANIA_CELULAR()+"</td><td>"+monto_asignado+"</td><td>"+monto_consumido+"</td><td>"+descuento_neto+"</td></tr>";
                            }                                                    
                            else
                                tabla2+="<tr><td>"+numero+"</td><td>Este numero no se encuentra asignado a ningun empleado.</td></tr>";
                        }
                        else
                                tabla2+="<tr><td>"+numero+"</td><td>Este numero se encuentra Deshabilitado en el sistema.</td></tr>";
                    }      
                    else
                        tabla2+="<tr><td>"+numero+"</td><td>Este numero no se encuentra registrado en nuestro sistema.</td></tr>";
                }
            }
            for (int telf:todos) 
            {
                tabla2+="<tr><td>"+telf+"</td><td>Este numero no se encuentra en la lista seleccionada.</td></tr>";
            }
            
            
            return "{\"tabla1\":\""+tabla1+"\",\"tabla2\":\""+tabla2+"\"}";
        }
        catch(Exception e)
        {
            e.printStackTrace();
            return false+"";
        }
    }

    private String llenartabla(HttpServletRequest request, Conexion con) throws SQLException {
        int ano = Integer.parseInt(request.getParameter("ano"));
        int mes = Integer.parseInt(request.getParameter("mes"));
        List<RHH_PLANILLA_CELULAR> ps = new RHH_PLANILLA_CELULAR(con).TodosXanoYmes(ano, mes);
        String html="{\"tabla\": \"";
        int estado=1;
        int llena=1;
        for(RHH_PLANILLA_CELULAR planilla:ps)
        {
            RHH_PERSONA persona = new RHH_PERSONA(con).Buscar(planilla.getCI()+"");
            RHH_TELEFONOS telf = new RHH_TELEFONOS(con).BuscarxId(planilla.getID_TELEFONO());
            RHH_COMPANIA_TELEFONOS comp = new RHH_COMPANIA_TELEFONOS(con).BuscarXid(telf.getID_COMPANIA_CELULAR());
            html+="<tr><td>"+persona.getPRIMER_NOMBRE()+" "+persona.getPRIMER_APELLIDO()+"</td><td>"+persona.getCI()+"</td><td>"+telf.getNUMERO_CORTO()+"</td><td>"+telf.getNUMERO()+"</td><td>"+comp.getDESCRIPCION()+"</td><td>"+telf.getMONTO_CREDITO()+"</td><td>"+planilla.getMONTO_FACTURADO()+"</td><td>"+planilla.getDESCUENTO()+"</td></tr>";
            
            estado = planilla.getESTADO();
            llena=0;
        }
        return html+"\",\"estado\":\""+estado+"\",\"llena\":\""+llena+"\"}";
    }

    private void eliminacionPlanilla(int ano, int mes, Conexion con) throws SQLException
    {
        try
        {
            List<RHH_PLANILLA_CELULAR> pc = new RHH_PLANILLA_CELULAR(con).TodosXanoYmes(ano, mes);        
            String idcc = "";



            for(RHH_PLANILLA_CELULAR list:pc)
            {
                RHH_PLAN_CELULAR_COMPROBANTE aux =new RHH_PLAN_CELULAR_COMPROBANTE(con).buscarIdCC(list.getID());
                idcc+=aux.getID_CUENTA_COMPROBANTE()+",";
                aux.EliminarXid();
            }
            if(pc.size()>0)
            {
                idcc=idcc.substring(0,idcc.length()-1);        
                CON_CUENTA_COMPROBANTE cc = new CON_CUENTA_COMPROBANTE();
                cc.setCon(con);
                cc.EliminarMultiplesId(idcc);
            }
        }catch(Exception e)
        {
            
        }
        
    }
    
    private String guardar(HttpServletRequest request, Conexion con) {
        try{
            int ano = Integer.parseInt(request.getParameter("ano"));
            int mes = Integer.parseInt(request.getParameter("mes"));
            eliminacionPlanilla(ano, mes, con);
            Part part = request.getPart("importado");
            InputStream in = part.getInputStream();
            new RHH_PLANILLA_CELULAR(con).EliminarXanoYmes(ano, mes);
            BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));        
            String linea;             
            while((linea=br.readLine())!=null)
            {
                StringTokenizer token = new StringTokenizer(linea,";");
                if(token.countTokens()==2)
                {
                    String numero = token.nextToken();
                    Double monto_consumido = Double.parseDouble(token.nextToken());
                    RHH_PERSONA persona = new RHH_PERSONA(con).Buscarxtelefono(numero);
                    RHH_TELEFONOS telf = new RHH_TELEFONOS(con).buscarxNumero(numero);

                    if(telf!=null)
                    {                        
                        if(persona!=null)
                        {                                             
                            double monto_asignado=telf.getMONTO_CREDITO();
                            double descuento = monto_consumido-monto_asignado;
                            double iva = SIS_ESPECIAL.getCreditoFiscal(con);
                            double descuento_neto = descuento*(1-iva);
                            RHH_PLANILLA_CELULAR ps = new RHH_PLANILLA_CELULAR(0, telf.getID(), persona.getCI(), ano, mes, descuento_neto, monto_consumido);
                            ps.setCon(con);
                            ps.Insertar();
                        }                      
                    }         
                }
            }                        
            return true+"";
        }
        catch(Exception e)
        {
            e.printStackTrace();
            return false+"";
        }
    }

    private String pagar(HttpServletRequest request, Conexion con) throws SQLException, Exception {
        int ano = Integer.parseInt(request.getParameter("ano"));
        int mes = Integer.parseInt(request.getParameter("mes"));   
        eliminacionPlanilla(ano, mes, con);
        List<RHH_PLANILLA_CELULAR> planilla = new RHH_PLANILLA_CELULAR(con).TodosXanoYmes(ano, mes);
        CON_COMPROBANTE comprobante = new CON_COMPROBANTE();
        comprobante.setCon(con);
        comprobante=comprobante.BuscarXRECURRENTE(6);
                
        for(RHH_PLANILLA_CELULAR plan:planilla)
        {
            CON_PARAMETRIZACION_CELULARES param = new CON_PARAMETRIZACION_CELULARES(con).BuscarXcelular(plan.getID_TELEFONO());
            int idcc = -1;
            if(param!=null)
            {
                if(param.getID_CENTRO_COSTO()>0)
                {
                    CON_CENTRO_COSTO centro = new CON_CENTRO_COSTO(con).BuscarXid(param.getID_CENTRO_COSTO());
                    CON_CUENTA_COMPROBANTE cc = new CON_CUENTA_COMPROBANTE(0.0, 0.0, 0.0, 0.0, plan.getMONTO_FACTURADO(), "Pago celaulares "+mes+"/"+ano, param.getID_CUENTA(), comprobante.getID(),param.getID_CENTRO_COSTO(), centro.getDESCRIPCION(), 0.0);
                    cc.setCon(con);
                    idcc=cc.Insertar();
                }
                else
                {
                    CON_CUENTA_CONTABLE cuenta = new CON_CUENTA_CONTABLE(con);
                    cuenta=cuenta.BuscarXid(param.getID_CUENTA());
                    CON_CUENTA_COMPROBANTE cc = new CON_CUENTA_COMPROBANTE(0.0, 0.0, 0.0, 0.0, plan.getMONTO_FACTURADO(), "Pago celaulares "+mes+"/"+ano, param.getID_CUENTA(), comprobante.getID(),0.0, cuenta.getDESCRIPCION(), 0.0);
                    cc.setCon(con);
                    idcc=cc.Insertar();
                }
            }            
            
            if(idcc!=-1)
            {
                RHH_PLAN_CELULAR_COMPROBANTE pcc = new RHH_PLAN_CELULAR_COMPROBANTE(plan.getID(),idcc);
                pcc.setCon(con);
                pcc.Insertar();
            }
        }
         new RHH_PLANILLA_CELULAR(con).pagar(ano, mes);
        return true+"";
    }
}
